#include<iostream>
#include<unistd.h>
#include<string>
#include<pthread.h>
using namespace std;

// void* handler(void *args)
// {
//     while(true)
//     {
//         cout<<"i am newthread"<<endl;
//         sleep(1);
//     }
    
// } 

// int main()
// {
//     pthread_t tid;
//     int n = pthread_create(&tid,nullptr,handler,nullptr);
//     while(true)
//     {
//         cout<<"i am main thread,running..."<<endl;
//         sleep(1);
//     }

//     return 0;
// }
// std::string ToHex(pthread_t tid)
// {
//     char id[64];
//     snprintf(id,sizeof(id),"0x%lx",tid);
//     return id;
// }
// int g_val = 2;
// void* threadrun(void *args)
// {
//     int cnt = 5;
//     std::string threadname = (char*)args;
//     while(cnt)
//     {
//         cout<<threadname<<"is running:"<<cnt<<",pid:"<<getpid()<<",mythread id:"<<ToHex(pthread_self())<<",g_val:"<<g_val<<",&g_val"<<&g_val<<endl;
//         g_val++;
//         sleep(1);
//         cnt--;
//     }
// }

// int main()
// {
//     pthread_t tid;
//     pthread_create(&tid,nullptr,threadrun,(void*)"thread -1");
//     int cnt = 10;
//     while(cnt)
//     {
//         cout<<"main thread is running...,cnt:"<<cnt<<",pid:"<<getpid()<<",newthread tid"<<ToHex(tid)<<",main thread id:"<<ToHex(pthread_self())
//         <<",g_val:"<<g_val<<",&g_val"<<&g_val<<endl;
//         sleep(1);
//         cnt--;
//     }
//     return 0;
// }
// int g_val = 2;
// void *threadrun(void *args)
// {
//     int cnt = 5;
//     while(cnt)
//     {
//         printf("new thread,g_val:%d,&g_val:%p\n",g_val,&g_val);
//         g_val++;
//         sleep(1);
//         int *p = nullptr;
//         *p = 100;//故意野指针
//         cnt--;
//     }
//     return (void*)123;
// }
// int main()
// {
//     pthread_t tid;
//     pthread_create(&tid,nullptr,threadrun,(void*)"thread -1");
//     void *ret = nullptr;
//     while(true)
//     {
//         printf("main thread is running,g_val:%d,&g_val:%p\n",g_val,&g_val);
//         sleep(1);
//     }
//     int n = pthread_join(tid,&ret);
//     cout << "main thread quit, n=" << n << " main thread get a ret: " << (long long)ret << std::endl;
// }


// void* threadrun(void *args)
// {
//     int cnt = 5;
//     std::string threadname = (char*)args;
//     while(cnt)
//     {
//         cout<<threadname<<" is running..."<<endl;
//         sleep(1);
//         cnt--;
//         if(cnt == 2)
//         {
//             pthread_exit(nullptr);
//         }
//     }
//     return (void*)123;
// }

// int main()
// {
//     pthread_t tid;
//     pthread_create(&tid,nullptr,threadrun,(void*)"thread -1");
//     void *ret = nullptr;
//     int cnt = 10;
//     while(cnt)
//     {
//         cout<<"main thread is running..."<<endl;
//         sleep(1);
//         cnt--;
//     }
//     int n = pthread_join(tid,&ret);
//     cout << "main thread quit, n=" << n << std::endl;
//     return 0;
// }


void* threadrun(void *args)
{
    int cnt = 5;
    std::string threadname = (char*)args;
    while(cnt)
    {
        cout<<threadname<<" is running..."<<endl;
        sleep(1);
        cnt--;
    }
    return (void*)123;
}

int main()
{
    pthread_t tid;
    pthread_create(&tid,nullptr,threadrun,(void*)"thread -1");
    void *ret = nullptr;
    int cnt = 10;
    while(cnt)
    {
        cout<<"main thread is running..."<<endl;
        sleep(1);
        cnt--;
        if(cnt == 7)
        {
            break;
        }
    }
    pthread_cancel(tid);
    cout<<"pthread_cancel:"<<tid<<endl;
    int n = pthread_join(tid,&ret);
    cout << "main thread quit, n=" << n << " main thread get a ret: " << (long long)ret << std::endl;
    return 0;
}